home *** CD-ROM | disk | FTP | other *** search
/ TOS Silver 2000 / TOS Silver 2000.iso / programm / MM2_DEV / S / GEM / VDIINPUT.D < prev    next >
Encoding:
Modula Definition  |  1990-10-09  |  15.0 KB  |  348 lines

  1. DEFINITION MODULE VDIInputs;
  2.  
  3.  
  4. (*  Megamax-Modula 2 GEM-Library :  Die VDI Eingabefunktionen
  5.  *
  6.  *  Autor: Manuel Chakravarty           Erstellt :  04.11.87
  7.  *
  8.  *  Version 2.2         V#0006
  9.  *)
  10.  
  11. FROM    SYSTEM     IMPORT WORD, LONGWORD;
  12. FROM    MOSGlobals IMPORT MemArea;
  13. FROM    GrafBase   IMPORT Point, Rectangle, PtrMouseFormDef;
  14. FROM    GEMGlobals IMPORT GemChar, MButtonSet, SpecialKeySet;
  15. FROM    GEMEnv     IMPORT DeviceHandle;
  16.  
  17.  
  18. PROCEDURE RequestLoc (    handle : DeviceHandle;
  19.                           start  : Point;
  20.                       VAR termBut: CHAR;
  21.                       VAR loc    : Point);
  22.  
  23.         (*  Der Mauszeiger wird auf eine bestimmte Position gesetzt,
  24.          *  danach wird gewartet, bis eine Taste oder ein Mausknopf
  25.          *  gedrückt wird.
  26.          *
  27.          *  'start'     -- An diese Stelle wird der Mauszeiger gesetzt.
  28.          *  'termbut'   -- Code der Taste, die zum Abbruch führte.
  29.          *                 ( = 32/33: linke bzw. rechte Maustaste)
  30.          *
  31.          *  ACHTUNG: Die Routine funktioniert nur bei physikalisch
  32.          *           geöffneten Arbeitsstationen (Devices), jedoch
  33.          *           nicht bei virtuellen (wie dem Bildschirm)!
  34.          *)
  35.  
  36. PROCEDURE TestLoc (    handle              : DeviceHandle;
  37.                        start               : Point;
  38.                    VAR termbut             : CHAR;
  39.                    VAR keyPress, koorChange: BOOLEAN;
  40.                    VAR loc                 : Point);
  41.  
  42.         (*  Entspricht 'RequestLoc' nur wird nicht gewartet, bis eine Taste
  43.          *  gedrückt ist, sondern gleich zurückgekehrt.
  44.          *  Ist 'keyPress = TRUE', so wurde eine Taste betätigt.
  45.          *  Ist 'koorChange = TRUE', so wurde der Mauszeiger bewegt.
  46.          *
  47.          *  ACHTUNG: Die Routine funktioniert nur bei physikalisch
  48.          *           geöffneten Arbeitsstationen (Devices), jedoch
  49.          *           nicht bei virtuellen (wie dem Bildschirm)!
  50.          *)
  51.  
  52.  
  53. (*      Die folgenden acht Routinen arbeiten in der aktuellen TOS-Version
  54.  *      nicht. Evtl. mit GDOS.
  55.  *)
  56.  
  57. PROCEDURE RequestValue (    handle : DeviceHandle;
  58.                             start  : CARDINAL;
  59.                         VAR termBut: CHAR;
  60.                         VAR value  : CARDINAL);
  61.  
  62.         (*  Der Startwert 'start' kann vom Anwender solange mit den
  63.          *  Cursortasten verändert werden, bis er eine andere Taste
  64.          *  drückt.
  65.          *  'value' liefert den neuen Wert und 'termBut' die Taste,
  66.          *  mit der abgebrochen wurde.
  67.          *  Wert liegt zwischen 1 und 100
  68.          *)
  69.  
  70. TYPE    TValState       = (nothingHappened, valueChanged, keyPressed);
  71.  
  72. PROCEDURE TestValue (    handle : DeviceHandle;
  73.                          start  : CARDINAL;
  74.                      VAR termbut: CHAR;
  75.                      VAR status : TValState;
  76.                      VAR value  : CARDINAL);
  77.  
  78.         (*  Entspricht 'RequestValue', nur wird sofort zurückgekehrt und
  79.          *  'status' enthält
  80.          *
  81.          *    'nothingHappened', falls keine Benutzeraktion erfolgte,
  82.          *    'valueChanged'   , falls der Wert geändert wurde,
  83.          *    'keyPressed'     , falls eine Taste gedrückt wurde.
  84.          *)
  85.  
  86. PROCEDURE RequestChoice (    handle: DeviceHandle;
  87.                              start : CARDINAL;
  88.                          VAR choice: CARDINAL);
  89.  
  90.         (*  Es wird gewartet bis eine Taste gedrückt wird.
  91.          *  War es eine Funktionstaste, so wird deren Nummer in 'choice'
  92.          *  geliefert, sonst der in 'start' übergebenen Wert (1 - 10).
  93.          *)
  94.  
  95. PROCEDURE TestChoice (    handle  : DeviceHandle;
  96.                       VAR keyPress: BOOLEAN;
  97.                       VAR choice  : CARDINAL);
  98.  
  99.         (*  Wie 'TestChoice', nur wird nicht gewartet. Und es ist 'keyPress
  100.          *  = TRUE', falls eine Funktionstaste betätigt wurde.
  101.          *)
  102.  
  103. PROCEDURE RequestString (    handle : DeviceHandle;
  104.                          VAR str    : ARRAY OF CHAR;
  105.                              echo   : BOOLEAN;
  106.                              echoLoc: Point);
  107.  
  108.         (*  Wartet bis ein String vollständig, durch <Return> abgeschlossen,
  109.          *  eingegeben wurde. Falls 'echo = TRUE' ist, wird die Eingabe ab
  110.          *  der Position 'echoLoc' auf dem Bildschirm ausgegeben.
  111.          *
  112.          *  ACHTUNG: Diese Routine ist in der aktuellen Version nicht impl.
  113.          *)
  114.  
  115. PROCEDURE TestString (    handle : DeviceHandle;
  116.                       VAR str    : ARRAY OF CHAR;
  117.                           echo   : BOOLEAN;
  118.                           echoLoc: Point;
  119.                       VAR success: BOOLEAN);
  120.  
  121.         (*  Entspricht 'RequestString' nur wird nicht auf ein <Return> ge-
  122.          *  wartet. Ist 'success = TRUE', so wurde mindestens ein Zeichen
  123.          *  gelesen.
  124.          *
  125.          *  ACHTUNG: Diese Routine ist in der aktuellen Version nicht impl.
  126.          *)
  127.  
  128. PROCEDURE RStringCode (    handle : DeviceHandle;
  129.                        VAR str    : ARRAY OF GemChar;
  130.                            echo   : BOOLEAN;
  131.                            echoLoc: Point);
  132.  
  133.         (*  Wie 'RequestString', nur wird sowohl ASCII als auch IBM-Scancode
  134.          *  geliefert.
  135.          *
  136.          *  ACHTUNG: Diese Routine ist in der aktuellen Version nicht impl.
  137.          *)
  138.  
  139. PROCEDURE TStringCode (    handle : DeviceHandle;
  140.                        VAR str    : ARRAY OF GemChar;
  141.                            echo   : BOOLEAN;
  142.                            echoLoc: Point;
  143.                        VAR success: BOOLEAN);
  144.  
  145.         (*  Wie 'TestString', nur wird sowohl ASCII als auch IBM-Scancode
  146.          *  geliefert.
  147.          *
  148.          *  ACHTUNG: Diese Routine ist in der aktuellen Version nicht impl.
  149.          *)
  150.  
  151.  
  152. PROCEDURE SetMouseForm (handle : DeviceHandle;
  153.                         newForm: PtrMouseFormDef);
  154.  
  155.         (*  Die durch 'newForm' spezifierte Mausform wird durch diese
  156.          *  Routine gesetzt.
  157.          *)
  158.  
  159. PROCEDURE ShowCursor (handle: DeviceHandle; force: BOOLEAN);
  160.  
  161.         (*  Der Grafikcursor (Mauszeiger) wird sichtbar gemacht.
  162.          *  Da das VDI mitzählt, wie oft der Zeiger versteckt wurde, muß
  163.          *  er auch entsprechend oft sichtbar gemacht werden. Dies kann
  164.          *  umgangen werden, indem man für 'force' den Wert 'TRUE' an-
  165.          *  gibt. Daraufhin wird der Cursor auf alle Fälle angezeigt.
  166.          *
  167.          *  ACHTUNG: Diese Funktion darf nur bei physikalisch geöffneten
  168.          *           Arbeitstationen (Devices) verwendet werden. Beim
  169.          *           Bildschirm (eine virtuelle Arbeitsstation) müssen
  170.          *           Sie stattdessen die Funktion "GrafMouse" aus
  171.          *           AESGraphics verwenden!
  172.          *)
  173.  
  174. PROCEDURE HideCursor (handle: DeviceHandle);
  175.  
  176.         (*  Der Grafikcursor wird versteckt (unsichtbar).
  177.          *  Siehe auch 'ShowCursor'.
  178.          *
  179.          *  ACHTUNG: Diese Funktion darf nur bei physikalisch geöffneten
  180.          *           Arbeitstationen (Devices) verwendet werden. Beim
  181.          *           Bildschirm (eine virtuelle Arbeitsstation) müssen
  182.          *           Sie stattdessen die Funktion "GrafMouse" aus
  183.          *           AESGraphics verwenden!
  184.          *)
  185.  
  186. PROCEDURE GetMouseState (    handle  : DeviceHandle;
  187.                          VAR position: Point;
  188.                          VAR buts    : MButtonSet);
  189.  
  190.         (*  Es wird die aktuelle Position des Mauszeigers ('position')
  191.          *  und der Status (gedrückt oder nicht) der Mausknöpfe ('buts')
  192.          *  erfragt.
  193.          *)
  194.  
  195. PROCEDURE KeyboardState (handle: DeviceHandle): SpecialKeySet;
  196.  
  197.         (*  Es wird ermittelt welche Sondertasten (Alternate, Control,
  198.          *  linke und rechte Shifttaste) gedrückt sind.
  199.          *)
  200.          
  201.          
  202. (*      Mit Hilfe der folgenden Routinen können sogenannte 'Softvektoren',
  203.  *      dies sind datentechnisch Prozedurvariablen, 'umgebogen' werden.
  204.  *      Im Klartext bedeutet dies, daß für den ursprünglichen Wert der Pro-
  205.  *      zedurvariable ein neuer eingesetzt wird. Diese neue Prozedur hat
  206.  *      zwei Möglichkeiten, zum einen kann sie die alte Prozedur voll-
  207.  *      ständig ersetzen. Andererseits kann sie die zu verarbeitenden Daten
  208.  *      lediglich modifizieren, kontrollieren oder protokolieren und da-
  209.  *      nach die ursprüngliche Routine aufrufen.
  210.  *      Dies Prinzip ist nun folgendermaßen implementiert worden. Zu jedem
  211.  *      der Vektoren (Prozedurvariablen) wird eine Liste verwaltet. In diese
  212.  *      Liste können Prozeduren mit einer bestimmten Schnittstelle (Para-
  213.  *      meterliste) eingetragen und natürlich auch wieder gelöscht werden.
  214.  *      Wird nun eine dieser Prozedurvariablen benutzt, so wird zuerst die
  215.  *      zuletzt installierte Routine ausgeführt und falls diese es wünscht
  216.  *      eine weitere. Dies setzt sich durch die gesamte Liste fort. Wird
  217.  *      nun das Listenende erreicht, so wird die, vor dem Aktivieren dieses
  218.  *      Moduls aktuelle Prozedur ausgeführt.
  219.  *      Jede installierte Routine liefert als Ergebnis einen BOOLEAN-Wert.
  220.  *      Ist dieser gleich 'TRUE', so heißt dies, daß mit der Ausführung
  221.  *      der in der Liste enthaltenen Prozeduren fortgefahren werden soll.
  222.  *      Sonst wird die Kette unterbrochen.
  223.  *
  224.  *      Zum Installieren einer Prozedur muß ein 'Carrier' (Träger) übergeben
  225.  *      werden, dieser dient erstens als Kennung (handle) und zweitens wird
  226.  *      er zur zum Aufbau der Listenstruktur benötigt. Daher ist es von ele-
  227.  *      mentarer Wichtigkeit, daß der Carrier global definiert wird und bis
  228.  *      zum Entfernen der Routine aus der Liste weder anderweitig verwendet,
  229.  *      noch irgendwie freigegeben wird. Weiter muß ein Arbeitsbereich (work-
  230.  *      space) für die Prozedur angegeben werden, dieser wird während der Ab-
  231.  *      arbeitung der Routine als Stackbereich verwendet, es muß also unbe-
  232.  *      dingt sichergestellt werden, daß dieser Speicherbereich erstens zur
  233.  *      Verfügung steht, zweitens nicht schon benutzt wird und eine aus-
  234.  *      reichende Größe besitzt. In der Regel reichen wohl 2 kByte aus.
  235.  *
  236.  *      Achtung: Die Aufrufe der Vektoren geschehen von Interruptroutinen aus.
  237.  *               Da große Teile des Betriebssystem nicht oder nur bedingt re-
  238.  *               entrantfähig sind, das heißt es darf während eines Betriebs-
  239.  *               systemaufrufes noch ein weiterer ausgeführt werden, ist es
  240.  *               zu empfehlen, solche Aufrufe (dazu gehöhrt z.B. auch 'Write')
  241.  *               nicht in einer Vektorroutine zu tätigen. Es könnten völlig
  242.  *               unvorhersehbare Systemabstürze herbeigeführt werden!
  243.  *)
  244.  
  245.  
  246. TYPE    TimerVecCarrier          = ARRAY[0..11] OF WORD;
  247.         TimerVecProc             = PROCEDURE (): BOOLEAN;
  248.  
  249. PROCEDURE InstallTimerProc (VAR hdl      : TimerVecCarrier;
  250.                                 newProc  : TimerVecProc;
  251.                                 wsp      : MemArea;
  252.                             VAR deltaTime: CARDINAL);
  253.                             
  254.         (*  Der Timervektor stellt eine Prozedurvariable dar, die in bestim-
  255.          *  mten Zeitabständen immer wieder aufgerufen wird. Er ist also
  256.          *  für das Abarbeiten zyklisch wiederkehrender Aufgaben prädesti-
  257.          *  niert.
  258.          *  'hdl'       --  der Carrier für die hiermit angemeldete Prozedur
  259.          *  'newProc'   --  beschreibt den von ihr zu benutzenden Stack-
  260.          *                  bereich.
  261.          *  'wsp'       --  ebenfalls
  262.          *  'deltaTime' --  Der Zeitabstand zwischen zwei Aufrufen (in Milli-
  263.          *                  sekunden).
  264.          *)
  265.  
  266. PROCEDURE RemoveTimerProc (VAR hdl: TimerVecCarrier);
  267.  
  268.         (*  Meldet die durch 'hdl' beschriebene Prozedur wieder ab, das
  269.          *  heißt sie wird aus der Liste der aufzurufenden Prozeduren
  270.          *  gestrichen.
  271.          *)
  272.  
  273.  
  274. TYPE    ButChgVecCarrier        = ARRAY[0..9] OF WORD;
  275.         ButChgVecProc           = PROCEDURE (VAR (* pressed: *) MButtonSet)
  276.                                             : BOOLEAN;
  277.         
  278. PROCEDURE InstallButChgProc (VAR hdl: ButChgVecCarrier;
  279.                              newProc: ButChgVecProc;
  280.                              wsp    : MemArea);
  281.                              
  282.         (*  Der Button-Change-Vektor wird immer aufgerufen, wenn der Status
  283.          *  der Maustasten geändert wurde. Also eine Maustaste gedrückt oder
  284.          *  losgelassen wurde. Jeder installierten Routine werden die zur
  285.          *  Zeit gedrückten Maustasten (in 'pressed') übergeben. Dieser
  286.          *  Wert kann geändert werden und es wird die geänderte Version dann
  287.          *  auch vom Betriebssystem übernommen.
  288.          *  'hdl' enthält den Carrier, 'newProc' die neue Prozedur und 'wsp'
  289.          *  ihren Stackbereich.
  290.          *)
  291.  
  292. PROCEDURE RemoveButChgProc (VAR hdl: ButChgVecCarrier);
  293.  
  294.         (*  Meldet die mit 'InstallButChgProc' installierte Routine
  295.          *  wieder ab.
  296.          *)
  297.  
  298.  
  299. TYPE    MsMoveVecCarrier        = ARRAY[0..9] OF WORD;
  300.         MsMoveVecProc           = PROCEDURE (VAR (*loc:*) Point)
  301.                                             : BOOLEAN;
  302.         
  303. PROCEDURE InstallMsMoveProc (VAR hdl    : MsMoveVecCarrier;
  304.                                  newProc: MsMoveVecProc;
  305.                                  wsp    : MemArea);
  306.  
  307.         (*  Der Mouse-Movement-Vektor wird bei jeder Mausbewegung ange-
  308.          *  sprungen. Dabei wird der Routine (in 'loc') die aktuelle
  309.          *  Mausposition übergegeben, diese kann von der Routine auch
  310.          *  verändert werden. Durch Vertauschen der Koordinaten kann man
  311.          *  z.B die beiden Bewegungsrichtungen der Maus vertauschen.
  312.          *  Mit etwas mehr Aufwand können die Bewegungen auch gespie-
  313.          *  gelt werden oder es wird einfach ein Rahmen vorgegeben,
  314.          *  der von der Maus nicht verlassen werden darf.
  315.          *  Es ist 'hdl' der Carrier und 'wsp' der Stackbereich für die
  316.          *  zu installierende Routine 'newProc'.
  317.          *)
  318.                           
  319. PROCEDURE RemoveMsMoveProc (VAR hdl: MsMoveVecCarrier);
  320.  
  321.         (*  Es wird 'hdl' abgemeldet.
  322.          *)
  323.          
  324.  
  325. TYPE    CurChgVecCarrier        = ARRAY[0..9] OF WORD;
  326.         CurChgVecProc           = PROCEDURE (VAR (*loc:*) Point)
  327.                                             : BOOLEAN;
  328.         
  329. PROCEDURE InstallCurChgProc (VAR hdl    : CurChgVecCarrier;
  330.                                  newProc: CurChgVecProc;
  331.                                  wsp    : MemArea);
  332.                              
  333.         (*  Der Cursor-Change-Vektor wird bei jeder Positionsänderung
  334.          *  des Mauszeigers aufgerufen. Der aufgerufenen Prozedur wird
  335.          *  (in 'loc') die neue Mauszeigerposition übergeben.
  336.          *  Dabei ist 'hdl' der Carrier und 'wsp' der Stackbereich der
  337.          *  Prozedur 'newProc'.
  338.          *)
  339.                           
  340. PROCEDURE RemoveCurChgProc (VAR hdl: CurChgVecCarrier);
  341.  
  342.         (*  Es wird eine mit obiger Prozedur angemeldete Routine wieder
  343.          *  abgemeldet.
  344.          *)
  345.  
  346.  
  347. END VDIInputs.
  348.